<?php  if(!defined('IN_WDPHP'))exit('No direct script access.');
/**
 * WDPHP  			验证码类
 * @package 		WDPHP
 * @author 			肖伟 
 * @version 		v1.0
 * @copyright 		Copyright (c) 2012. widuu.com
 */
class Vcode {
	//验证码的宽度
	private $width;
	
	//验证码的高
	private $height;
	
	//设置字体的地址
	private $font;
	
	//设置字体色
	private $font_color;
	
	//设置随机生成因子
	private $charset = 'abcdefghkmnprstuvwyzABCDEFGHKLMNPRSTUVWYZ23456789';

	
	//设置背景色
	private $background = '#EDF7FF';
	
	//生成验证码字符数
	private $code_len = 4;
	
	//字体大小
	private $font_size = 20;
	
	//验证码
	private $code;
	
	//图片内存
	private $img;
	
	//文字X轴开始的地方
	private $x_start;
		
	function __construct($height="50",$width="130",$code_len="4",$font_size="20",$background="#EDF7FF",$font_color="") {
		$this->font = WDPHP_PATH."View/images/elephant.ttf";
		$this->height=$height;
		$this->width=$width;
		$this->code_len=$code_len;
		$this->font_size=$font_size;
		$this->background=$background;
		$this->font_color=$font_color;
	}
	
	/**
	 * 生成随机验证码。
	 */
	protected function creat_code() {
		$code = '';
		$charset_len = strlen($this->charset)-1;
		for ($i=0; $i<$this->code_len; $i++) {
			$code .= $this->charset[rand(1, $charset_len)];
		}
		$this->code = $code;
	}
	
	/**
	 * 获取验证码
	 */
	private function get_code() {
		return strtolower($this->code);
	}
	
	/**
	 * 生成图片
	 */
	private function doimage() {
		$code = $this->creat_code();
		$this->img = imagecreatetruecolor($this->width, $this->height);
		if (!$this->font_color) {
			$this->font_color = imagecolorallocate($this->img, rand(0,156), rand(0,156), rand(0,156));
		} else {
			$this->font_color = imagecolorallocate($this->img, hexdec(substr($this->font_color, 1,2)), hexdec(substr($this->font_color, 3,2)), hexdec(substr($this->font_color, 5,2)));
		}
		//设置背景色
		$background = imagecolorallocate($this->img,hexdec(substr($this->background, 1,2)),hexdec(substr($this->background, 3,2)),hexdec(substr($this->background, 5,2)));
		//画一个柜形，设置背景颜色。
		imagefilledrectangle($this->img,0, $this->height, $this->width, 0, $background);
		$this->creat_font();
		$this->creat_line();
		$this->output();
	}
	
	/**
	 * 生成文字
	 */
	private function creat_font() {
		$x = $this->width/$this->code_len;
		for ($i=0; $i<$this->code_len; $i++) {
			imagettftext($this->img, $this->font_size, rand(-30,30), $x*$i+rand(0,5), $this->height/1.4, $this->font_color, $this->font, $this->code[$i]);
			if($i==0)$this->x_start=$x*$i+5;
		}
	}
	
	/**
	 * 画线
	 */
	private function creat_line() {
		imagesetthickness($this->img, 3);
	    $xpos   = ($this->font_size * 2) + rand(-5, 5);
	    $width  = $this->width / 2.66 + rand(3, 10);
	    $height = $this->font_size * 2.14;
	
	    if ( rand(0,100) % 2 == 0 ) {
	      $start = rand(0,66);
	      $ypos  = $this->height / 2 - rand(10, 30);
	      $xpos += rand(5, 15);
	    } else {
	      $start = rand(180, 246);
	      $ypos  = $this->height / 2 + rand(10, 30);
	    }
	
	    $end = $start + rand(75, 110);
	
	    imagearc($this->img, $xpos, $ypos, $width, $height, $start, $end, $this->font_color);
		
	    if ( rand(1,75) % 2 == 0 ) {
	      $start = rand(45, 111);
	      $ypos  = $this->height / 2 - rand(10, 30);
	      $xpos += rand(5, 15);
	    } else {
	      $start = rand(200, 250);
	      $ypos  = $this->height / 2 + rand(10, 30);
	    }
	
	    $end = $start + rand(75, 100);
	
	    imagearc($this->img, $this->width * .75, $ypos, $width, $height, $start, $end, $this->font_color);
	}
	
	/**
	 * 输出图片
	 */
	private function output() {
		$_SESSION['vcode']=$this->get_code();  //加到session中
		header("content-type:image/png\r\n");
		imagepng($this->img);
		imagedestroy($this->img);
	}
	/*
	 * 用于输出验证码图片，也向服务器的SESSION中保存了验证码
	 * 使用echo 输出对象即可
	 * @return string	验证码
	 */
		
	function __toString(){
		$this->doimage();              //输出验证码
		return '';
	}
	
	/*
	 * 析构函数 销毁图像资源
	 * @access public
	 */
	public function __destruct(){
		if($this->img)
		imagedestroy($this->img);
	}
}